package com.farm.kaiping.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.farm.common.security.SecurityUtils;
import com.farm.kaiping.entity.SysDict;
import com.farm.kaiping.entity.SysDictItem;
import com.farm.kaiping.mapper.SysDictMapper;
import com.farm.kaiping.po.SysDictItemPO;
import com.farm.kaiping.mapper.SysDictItemMapper;
import com.farm.kaiping.service.SysDictItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.farm.common.util.StringRange;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 字典项(SysDictItem)表服务实现类
 *
 * @author zhuhui
 * @since 2024-11-26 22:58:44
 */
@Service
@Slf4j
@AllArgsConstructor
public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements SysDictItemService {

	private final SysDictMapper sysDictMapper;
    
	private LambdaQueryWrapper<SysDictItem> generateQueryWrapper(SysDictItemPO sysDictItemPO){
		LambdaQueryWrapper<SysDictItem> queryWrapper = new LambdaQueryWrapper<>();
		// 编号ID
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getId()), SysDictItem::getId, sysDictItemPO.getId());
		queryWrapper.in(ObjectUtil.isNotEmpty(sysDictItemPO.getIdList()), SysDictItem::getId, sysDictItemPO.getIdList());
		// 字典ID
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getDictId()), SysDictItem::getDictId, sysDictItemPO.getDictId());
		// 字典标识
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getIdentify()), SysDictItem::getIdentify, sysDictItemPO.getIdentify());

		// 字典项的值
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getValue()), SysDictItem::getValue, sysDictItemPO.getValue());
		// 字典项的文本
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getLabel()), SysDictItem::getLabel, sysDictItemPO.getLabel());
		// 字典项的类型
		queryWrapper.like(ObjectUtil.isNotEmpty(sysDictItemPO.getType()), SysDictItem::getType, sysDictItemPO.getType());
		// 字典项的描述
		queryWrapper.like(ObjectUtil.isNotEmpty(sysDictItemPO.getDescription()), SysDictItem::getDescription, sysDictItemPO.getDescription());
		// 字典项的排序
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getSort()), SysDictItem::getSort, sysDictItemPO.getSort());
		// 创建时间
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getCreateTime()), SysDictItem::getCreateTime, sysDictItemPO.getCreateTime());
		// 更新时间
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getUpdateTime()), SysDictItem::getUpdateTime, sysDictItemPO.getUpdateTime());
		// 备注
		queryWrapper.like(ObjectUtil.isNotEmpty(sysDictItemPO.getRemarks()), SysDictItem::getRemarks, sysDictItemPO.getRemarks());
		// 是否删除(0否1是)
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getDelFlag()), SysDictItem::getDelFlag, sysDictItemPO.getDelFlag());
        queryWrapper.eq(ObjectUtil.isEmpty(sysDictItemPO.getDelFlag()), SysDictItem::getDelFlag, 0);
		// 所属租户
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getTenantId()), SysDictItem::getTenantId, sysDictItemPO.getTenantId());
		// 字典项的颜色
		queryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getColor()), SysDictItem::getColor, sysDictItemPO.getColor());
		// 创建时间时间区间查询
		queryWrapper.ge(ObjectUtil.isNotEmpty(StringRange.getOne(sysDictItemPO.getCreateTimeBetween(),0)), SysDictItem::getCreateTime,StringRange.getOne(sysDictItemPO.getCreateTimeBetween(),0));
		queryWrapper.le(ObjectUtil.isNotEmpty(StringRange.getOne(sysDictItemPO.getCreateTimeBetween(),1)), SysDictItem::getCreateTime,StringRange.getOne(sysDictItemPO.getCreateTimeBetween(),1));
		// 更新时间时间区间查询
		queryWrapper.ge(ObjectUtil.isNotEmpty(StringRange.getOne(sysDictItemPO.getUpdateTimeBetween(),0)), SysDictItem::getUpdateTime,StringRange.getOne(sysDictItemPO.getUpdateTimeBetween(),0));
		queryWrapper.le(ObjectUtil.isNotEmpty(StringRange.getOne(sysDictItemPO.getUpdateTimeBetween(),1)), SysDictItem::getUpdateTime,StringRange.getOne(sysDictItemPO.getUpdateTimeBetween(),1));

		queryWrapper.orderByDesc(SysDictItem::getCreateTime,SysDictItem::getId);
		return queryWrapper;
	}

	 /**
	  * @describe 分页查询字典项
	  * @author zhuhui
	  * @date 2024-11-26 22:58:44
	  */
	@Override
	public Page<SysDictItem> getSysDictItemPage(Page page, SysDictItemPO sysDictItemPO){
		LambdaQueryWrapper<SysDictItem> queryWrapper = this.generateQueryWrapper(sysDictItemPO);
        return this.baseMapper.selectPage(page, queryWrapper);
	}
	
	/**
     * @describe 查询字典项list
     * @author  zhuhui
     * @date  2024-11-26 22:58:44
     */
	@Override
	public List<SysDictItem> getSysDictItemList(SysDictItemPO sysDictItemPO){
		LambdaQueryWrapper<SysDictItem> queryWrapper = this.generateQueryWrapper(sysDictItemPO);
        return this.baseMapper.selectList(queryWrapper);
	}
	
	/**
     * @describe 获取一条数据 字典项
     * @author  zhuhui
     * @date  2024-11-26 22:58:44
     */
	@Override
	public SysDictItem getSysDictItem(SysDictItemPO sysDictItemPO){
		LambdaQueryWrapper<SysDictItem> queryWrapper = this.generateQueryWrapper(sysDictItemPO);
        queryWrapper.last("LIMIT 1");
        return this.baseMapper.selectOne(queryWrapper);
	}

    /**
     * @describe 新增字典项
     * @author  zhuhui
     * @date  2024-11-26 22:58:44
     */
	@Override
	public Integer saveSysDictItem(SysDictItemPO sysDictItemPO) {
		if(ObjectUtil.isEmpty(sysDictItemPO.getDictId())){
			throw new RuntimeException("字典ID为空");
		}
		if(ObjectUtil.isEmpty(sysDictItemPO.getIdentify())){
			throw new RuntimeException("字典标识为空");
		}
		if(ObjectUtil.isEmpty(sysDictItemPO.getValue())){
			throw new RuntimeException("字典项的值为空");
		}
		if(ObjectUtil.isEmpty(sysDictItemPO.getLabel())){
			throw new RuntimeException("字典项的文本为空");
		}
		if(ObjectUtil.isEmpty(sysDictItemPO.getSort())){
			sysDictItemPO.setSort(0);
		}

        sysDictItemPO.setDelFlag(0);
		sysDictItemPO.setTenantId(SecurityUtils.getUser().getTenantId());// 租户ID
		sysDictItemPO.setCreateTime(LocalDateTime.now());
		sysDictItemPO.setUpdateTime(LocalDateTime.now());
		SysDictItem sysDictItem = BeanUtil.copyProperties(sysDictItemPO, SysDictItem.class);
		this.save(sysDictItem);

		SysDictItemPO sysDictItemPO1 = new SysDictItemPO();
		sysDictItemPO1.setId(sysDictItem.getId());
		this.updateDictItemNum(sysDictItemPO1);

		return sysDictItem.getId();
	}

	/**
     * @describe 修改字典项
     * @author  zhuhui
     * @date  2024-11-26 22:58:44
     */
	@Override
	public String updateSysDictItem(SysDictItemPO sysDictItemPO) {
		if (ObjectUtil.isEmpty(sysDictItemPO.getId())) {
			throw new RuntimeException("id为空");
		}
		sysDictItemPO.setUpdateTime(LocalDateTime.now());
		SysDictItem sysDictItem = BeanUtil.copyProperties(sysDictItemPO, SysDictItem.class);
		this.updateById(sysDictItem);

		SysDictItemPO sysDictItemPO1 = new SysDictItemPO();
		sysDictItemPO1.setId(sysDictItemPO.getId());
		this.updateDictItemNum(sysDictItemPO1);

		return "修改成功";
	}

	/**
     * @describe 通过id删除字典项
     * @author  zhuhui
     * @date  2024-11-26 22:58:44
     */
	@Override
	public String removeSysDictItem(SysDictItemPO sysDictItemPO) {
		if (ObjectUtil.isEmpty(sysDictItemPO.getBatchDel())) {
			throw new RuntimeException("删除数据未选择");
		}
		LambdaUpdateWrapper<SysDictItem> removeWrapper = new LambdaUpdateWrapper<>();
		removeWrapper.in(SysDictItem::getId, sysDictItemPO.getBatchDel());
		removeWrapper.set(SysDictItem::getDelFlag,1);
		removeWrapper.set(SysDictItem::getUpdateTime,LocalDateTime.now());
		this.update(removeWrapper);

		SysDictItemPO sysDictItemPO1 = new SysDictItemPO();
		sysDictItemPO1.setIdList(sysDictItemPO.getBatchDel());
		this.updateDictItemNum(sysDictItemPO1);

		return "删除成功";
	}

	private void updateDictItemNum(SysDictItemPO sysDictItemPO){
		if (!ObjectUtil.isAllEmpty(sysDictItemPO.getIdList(),sysDictItemPO.getId())){
			LambdaQueryWrapper<SysDictItem> itemQueryWrapper = new LambdaQueryWrapper<>();
			itemQueryWrapper.in(ObjectUtil.isNotEmpty(sysDictItemPO.getIdList()),SysDictItem::getId, sysDictItemPO.getIdList());
			itemQueryWrapper.eq(ObjectUtil.isNotEmpty(sysDictItemPO.getId()),SysDictItem::getId, sysDictItemPO.getId());
			itemQueryWrapper.eq(SysDictItem::getDelFlag,0);
			List<SysDictItem> list = this.list(itemQueryWrapper);

			Map<Integer, List<SysDictItem>> collect = list.stream().collect(Collectors.groupingBy(SysDictItem::getDictId));
			collect.forEach((dictId, sysDictItems) -> {
				LambdaUpdateWrapper<SysDict> updateWrapper = new LambdaUpdateWrapper<>();
				updateWrapper.eq(SysDict::getId, dictId);
				updateWrapper.set(SysDict::getItemNum, sysDictItems.size());
				sysDictMapper.update(null,updateWrapper);
			});
		}
	}

}

